import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store/index.js'
import { getToken } from '@/utils/auth.js'
import router from '@/router'

// npm install nprogress --save  添加loading效果的包

// 创建axios实例
const service = axios.create({
  // 配置基础地址
  baseURL: process.env.VUE_APP_BASE_API, //基础地址 更具执行不同的命令，走不同的环境
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  //请求成功的回调函数
  config => {
    if (store.getters.token) {
      config.headers['X-Token'] = getToken()
    }
    return config
  },
  //请求失败的回调函数
  error => {
    // 失败执行promise
    console.log(error);
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  //响应成功的回调函数
  response => {
    // 如果响应回来的数据是Blob类型，则直接返回
    if(response.data instanceof Blob){
      return response.data
    }
    //先去掉axios原本的一层data
    const { code, msg, data } = response.data //默认是json格式数据
    //业务返回的code==200 { code:200,msg:'数据库删除失败',data:null}
    if (code === 200) {
      return data
    } else {
      //业务错误信息，直接获取后台返回的信息 { code:500,msg:'数据库删除失败||登录失败',data:null}
      Message({ type: 'error', message: msg })
      return Promise.reject(new Error(msg || 'Error'))
    }
  },
  //响应失败的回调函数
  async error => {
    console.log('err' + error) // for debug
    //http中status==401 说明token失效了
    if (error.response.status === 401) {
      //调用vuex仓库user模块下的actions中的logout方法
      await store.dispatch('user/logout');
      //主动跳转为登录页面
      router.push('/login');
      //提示消息
      Message({
        message: '登录凭证过期，请重新登录',
        type: 'warning',
        duration: 5 * 1000
      })
      return Promise.reject(error)
    }
    // error.message
    //Message({ type: 'error', message: error.message })
    //http状态码非200的情况下
    Message({ type: 'error', message: "服务器异常，请稍后再试" })
    return Promise.reject(error)
  }
)

export default service
